home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Python 1.3.3 / stdwin / Ports / mac / caret.c < prev    next >
Text File  |  1995-12-21  |  3KB  |  111 lines

  1. /* MAC STDWIN -- TEXT CARET HANDLING. */
  2.  
  3. /* The 'caret' is a blinking vertical bar indicating the text insertion point.
  4.    Each window has its own caret position (hcaret, vcaret) telling where the
  5.    insertion point is; if either is negative no caret is shown.
  6.    Only the caret of the active window is actually visible.
  7.    The blinking is done by repeatedly calling (in the event loop when idling)
  8.    blinkcaret(), which flips the caret's state if it's been stable long enough.
  9.    The file-static variable lastflip records when the caret has last changed
  10.    state.
  11.    A struct member caret_on indicates per window whether the caret is
  12.    currently drawn or not.  (A file-static variable would really suffice.)
  13.  
  14.    NB: all routines except w{set,no}caret assume win->w is the current GrafPort.    
  15. */
  16.  
  17. #include "macwin.h"
  18.  
  19. /* Function prototypes */
  20. STATIC void invertcaret _ARGS((WINDOW *win));
  21. STATIC void flipcaret _ARGS((WINDOW *win));
  22.  
  23. static long lastflip = 0;    /* Time when the caret last blinked */
  24.  
  25. /* Invert the caret's pixels. */
  26.  
  27. static void
  28. invertcaret(win)
  29.     WINDOW *win;
  30. {
  31.     Rect r;
  32.     FontInfo finfo;
  33.     
  34.     if (win->hcaret < 0 || win->vcaret < 0)
  35.         return;
  36.     GetFontInfo(&finfo);
  37.     makerect(win, &r,
  38.         win->hcaret-1,
  39.         win->vcaret,
  40.         win->hcaret,
  41.         win->vcaret + finfo.leading + finfo.ascent + finfo.descent);
  42.     InvertRect(&r);
  43. }
  44.  
  45. /* Flip the caret state, if the window has a caret.
  46.    Also set lastflip, so blinkcaret() below knows when to flip it again. */
  47.  
  48. static void
  49. flipcaret(win)
  50.     WINDOW *win;
  51. {
  52.     if (win->hcaret < 0 || win->vcaret < 0)
  53.         return;
  54.     invertcaret(win);
  55.     win->caret_on = !win->caret_on;
  56.     lastflip= TickCount();
  57. }
  58.  
  59. /* Make sure the caret is invisible.
  60.    This is necessary before operations like handling mouse clicks,
  61.    bringing up dialog boxes, or when the window goes inactive. */
  62.  
  63. void
  64. rmcaret(win)
  65.     WINDOW *win;
  66. {
  67.     if (win->caret_on)
  68.         flipcaret(win);
  69. }
  70.  
  71. /* Blink the caret, if there is one.
  72.    This should be called sufficiently often from the main event loop.
  73.    We only blink if enough ticks have passed since the last flip,
  74.    whether caused by us or by an explicit call to rmcaret(). */
  75.  
  76. void
  77. blinkcaret(win)
  78.     WINDOW *win;
  79. {
  80.     if (win->hcaret < 0 || win->vcaret < 0)
  81.         return;
  82.     if (TickCount() >= lastflip + GetCaretTime())
  83.         flipcaret(win);
  84. }
  85.  
  86. /* User-callable routine to specify the caret position.
  87.    The caret is not drawn now, but when the next blink is due. */
  88.  
  89. void
  90. wsetcaret(win, h, v)
  91.     WINDOW *win;
  92.     int h, v;
  93. {
  94.     SetPort(win->w);
  95.     rmcaret(win);
  96.     win->hcaret = h;
  97.     win->vcaret = v;
  98. }
  99.  
  100. /* User-callable routine to specify that the window has no caret.
  101.    This is indicated by setting (hcaret, vcaret) to (-1, -1). */
  102.  
  103. void
  104. wnocaret(win)
  105.     WINDOW *win;
  106. {
  107.     SetPort(win->w);
  108.     rmcaret(win);    /* See remark in wsetcaret() */
  109.     win->hcaret = win->vcaret= -1;
  110. }
  111.